#pragma once
#include <iostream>
#include <list>

using namespace std;
namespace own
{
	template <class T>
	class queue
	{
	public:
		queue()
		{}

		void push(const T& x)
		{
			_c.push_back(x);
		}

		void pop()
		{
			_c.pop_front();
		}

		T& front()
		{
			return _c.front();
		}

		T& back()
		{
			return _c.back();
		}

		const T& front() const 
		{
			return _c.front();
		}

		const T& back() const 
		{
			return _c.back();
		}

		bool empty()
		{
			return _c.empty();
		}

		size_t size()
		{
			return _c.size();
		}
	private:
		list<T> _c;
	};
}

//#include<deque>
//#include <list>
//namespace own
//{
//	template<class T, class Con = deque<T>>
//	//template<class T, class Con = list<T>>
//	class queue
//	{
//	public:
//		queue() {}
//		void push(const T& x) { _c.push_back(x); }
//		void pop() { _c.pop_front(); }
//		T& back() { return _c.back(); }
//		const T& back()const { return _c.back(); }
//		T& front() { return _c.front(); }
//		const T& front()const { return _c.front(); }
//		size_t size()const { return _c.size(); }
//		bool empty()const { return _c.empty(); }
//	private:
//		Con _c;
//	};
//}